﻿#ifndef QMLRELAYSWITCH_MACRO_H
#define QMLRELAYSWITCH_MACRO_H

// custom switch variable
#define mkswitchs(f) \
    f(s1) \
    f(s2) \
    f(s3) \
    f(s4) \
    f(s5) \
    f(s6) \
    f(s7) \
    f(s8)


// define
#define f_signal_def(x)          void x##Changed();
#define f_func_def(x)            bool get##x() const; void set##x(bool newValue);
#define f_signal_qstr(x)         void x##CommentChanged();
#define f_func_qstr(x)           QString getQStr##x() const; void setQStr##x(QString newValue);

// variable
#define f_enum(x)                e_##x,
#define f_var(x)                 bool m_##x;
#define f_var_init(x)            m_##x = false;
#define f_var_property(x)        Q_PROPERTY(bool m_##x READ get##x WRITE set##x NOTIFY x##Changed FINAL)
#define f_var_qstring(x)         QString m_##x##Comment;
#define f_var_property_init(x)   m_##x##Comment = QString();
#define f_var_property_qstr(x)   Q_PROPERTY(QString m_##x##Comment READ getQStr##x WRITE setQStr##x NOTIFY x##CommentChanged FINAL)

// function
#define f_func_get(x)            bool QmlRelaySwitch::get##x() const { return m_##x; }
#define f_func_set(x) \
void QmlRelaySwitch::set##x(bool newValue) \
{ \
        if (m_##x == newValue) return ; \
        m_##x = newValue; \
        emit x##Changed(); \
}
#define f_func_get_qstr(x)      QString QmlRelaySwitch::getQStr##x() const { return m_##x##Comment; }
#define f_func_set_qstr(x) \
void QmlRelaySwitch::setQStr##x(QString newValue) \
{ \
        if (m_##x##Comment == newValue) return ; \
        m_##x##Comment = newValue; \
        emit x##CommentChanged(); \
}

// switch {} extend
#define f_syncSwitchStatus2Qml(x)      case e_##x: set##x(state); break;
#define f_syncSwitchStatus2Qml_1(x)    else if (name == m_##x##Comment) { channel = e_##x; }

#endif // QMLRELAYSWITCH_MACRO_H
